#include<iostream>
#include<stack>
using namespace std;
class MinStack {
public:
    MinStack() {

    }

    void push(int val) {
        _st.push(val);
        if (_minst.empty() || val <= _minst.top().val)
        {
            if (!_minst.empty() && _minst.top().val == val)
            {
                ++_minst.top().count;
            }
            else
            {
                struct Count ct;
                ct.val = val;
                ct.count = 1;
                _minst.push(ct);
            }
        }
    }

    void pop() {
        if (_st.top() == _minst.top().val)
        {
            --_minst.top().count;
            if (_minst.top().count == 0)
            {
                _minst.pop();
            }
        }
        _st.pop();
    }

    int top() {
        return _st.top();
    }

    int getMin() {
        return _minst.top().val;
    }
    struct Count
    {
        int val;
        int count;
    };
    stack<int> _st;
    stack<Count> _minst;
    void test1()
    {
        push(8);
        push(9);
        push(9);
        int minval = getMin();
        cout << minval << endl;
        push(7);
        minval = getMin();
        cout << minval << endl;
        push(2);
        minval = getMin();
        cout << minval << endl;
        push(9);
    }
    void test2()
    {
        push(-2);
        push(0);
        push(-3);
        int minval = getMin();
        cout << minval << endl;
        pop();
        int val = top();
        cout << val << endl;
        minval = getMin();
        cout << minval << endl;
    }
};
int main()
{
    MinStack().test2();
    return 0;
}